package com.scheduling.inventory.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.scheduling.inventory.dto.ProductInventoryQueryDTO;
import com.scheduling.inventory.entity.ProductInventory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 产品库存Mapper接口
 *
 * @author 开发团队
 * @since 2025-05-29
 */
@Mapper
public interface ProductInventoryMapper extends BaseMapper<ProductInventory> {

    /**
     * 分页查询产品库存（关联产品信息）
     *
     * @param page     分页参数
     * @param queryDTO 查询条件
     * @return 产品库存分页数据
     */
    IPage<ProductInventory> selectPageWithProduct(Page<ProductInventory> page,
                                                  @Param("query") ProductInventoryQueryDTO queryDTO);

    /**
     * 根据产品ID查询库存
     *
     * @param productId 产品ID
     * @return 产品库存
     */
    ProductInventory selectByProductId(@Param("productId") String productId);

    /**
     * 根据产品库存ID查询库存
     *
     * @param InventoryId 产品库存ID
     * @return 产品库存
     */
    ProductInventory selectByInventoryId(@Param("inventoryId") String InventoryId);

    /**
     * 更新在制品数量
     *
     * @param productId   产品ID
     * @param wipQuantity 在制品数量
     * @return 更新数量
     */
    int updateWipQuantity(@Param("productId") String productId, @Param("wipQuantity") BigDecimal wipQuantity);

    /**
     * 更新完成品数量
     *
     * @param productId        产品ID
     * @param finishedQuantity 完成品数量
     * @return 更新数量
     */
    int updateFinishedQuantity(@Param("productId") String productId,
                               @Param("finishedQuantity") BigDecimal finishedQuantity);

    /**
     * 批量更新库存数量
     *
     * @param inventoryList 库存列表
     * @return 更新数量
     */
    int batchUpdateQuantity(@Param("list") List<ProductInventory> inventoryList);

    /**
     * 检查产品是否存在库存记录
     *
     * @param productId 产品ID
     * @return 存在数量
     */
    int countByProductId(@Param("productId") String productId);

    /**
     * 根据产品名称模糊查询库存
     *
     * @param productName 产品名称
     * @return 产品库存列表
     */
    List<ProductInventory> selectByProductNameLike(@Param("productName") String productName);

    /**
     * 查询所有产品的库存汇总信息
     *
     * @return 产品库存列表
     */
    List<ProductInventory> selectInventorySummary();

    /**
     * 检查完成品库存是否充足
     *
     * @param productId        产品ID
     * @param requiredQuantity 所需数量
     * @return 是否充足
     */
    Boolean checkFinishedInventorySufficient(@Param("productId") String productId,
                                             @Param("requiredQuantity") BigDecimal requiredQuantity);

    /**
     * 增加在制品数量
     *
     * @param productId 产品ID
     * @param amount    增加数量
     * @return 更新数量
     */
    int increaseWipQuantity(@Param("productId") String productId, @Param("amount") BigDecimal amount);

    /**
     * 减少在制品数量
     *
     * @param productId 产品ID
     * @param amount    减少数量
     * @return 更新数量
     */
    int decreaseWipQuantity(@Param("productId") String productId, @Param("amount") BigDecimal amount);

    /**
     * 增加完成品数量
     *
     * @param productId 产品ID
     * @param amount    增加数量
     * @return 更新数量
     */
    int increaseFinishedQuantity(@Param("productId") String productId, @Param("amount") BigDecimal amount);

    /**
     * 减少完成品数量
     *
     * @param productId 产品ID
     * @param amount    减少数量
     * @return 更新数量
     */
    int decreaseFinishedQuantity(@Param("productId") String productId, @Param("amount") BigDecimal amount);
} 